package org.budo.dubbo.monitor.web.dao.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.budo.dubbo.monitor.entity.DubboInvoke;
import org.budo.dubbo.monitor.web.dao.IDubboInvokeDao;
import org.budo.mybatis.dao.MybatisDao;
import org.budo.mybatis.dao.base.MybatisBaseDao;
import org.budo.support.slf4j.Slf4j;
import org.slf4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

/**
 * @author limingwei2
 */
@Repository
public class DubboInvokeDaoImpl extends MybatisBaseDao<DubboInvoke, String> implements IDubboInvokeDao {
    private static final Logger log = Slf4j.getLogger();

    @Resource
    MybatisDao mybatisDao;

    public String insert(DubboInvoke entity) {
        mybatisDao.getSqlSession().insert("dubbo_invoke.addDubboInvoke", entity);
        return null;
    }

    /**
     * 统计调用数据用于图表展示
     */
    public List<DubboInvoke> countDubboInvoke(DubboInvoke dubboInvoke) {
        if (StringUtils.isEmpty(dubboInvoke.getService())) {
            log.error("统计查询缺少必要参数！");
            throw new RuntimeException("统计查询缺少必要参数！");
        }
        return mybatisDao.getSqlSession().selectList("dubbo_invoke.countDubboInvoke", dubboInvoke);
    }

    public List<String> getMethodsByService(DubboInvoke dubboInvoke) {
        return mybatisDao.getSqlSession().selectList("dubbo_invoke.getMethodsByService", dubboInvoke);
    }

    /**
     * 统计各方法调用信息
     */
    public List<DubboInvoke> countDubboInvokeInfo(DubboInvoke dubboInvoke) {
        if (StringUtils.isEmpty(dubboInvoke.getService()) || StringUtils.isEmpty(dubboInvoke.getMethod()) || StringUtils.isEmpty(dubboInvoke.getType())) {
            log.error("统计查询缺少必要参数！");
            throw new RuntimeException("统计查询缺少必要参数！");
        }
        return mybatisDao.getSqlSession().selectList("dubbo_invoke.countDubboInvokeInfo", dubboInvoke);
    }

    /**
     * 统计系统方法调用排序信息
     */
    @SuppressWarnings({ "rawtypes" })
    public Map<String, List> countDubboInvokeTopTen(DubboInvoke dubboInvoke) {
        Map<String, List> result = new HashMap<String, List>();
        List<Object> success = mybatisDao.getSqlSession().selectList("dubbo_invoke.countDubboInvokeSuccessTopTen", dubboInvoke);
        List<Object> failure = mybatisDao.getSqlSession().selectList("dubbo_invoke.countDubboInvokeFailureTopTen", dubboInvoke);
        result.put("success", success);
        result.put("failure", failure);
        return result;
    }
}